package com.itqf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * projectName: springmvcgp8
 *
 * @author: 赵伟风
 * time: 2021/8/6 11:00
 * description:
 */
@RequestMapping("resp")
@Controller
//@ResponseBody

//@RestController //你的当前类不能在返回页面  不能在转发和重定向  只有字符【json】
@SessionAttributes(names = {"key"})
public class ResponseController {

    @RequestMapping(value = "clear")
    public String clear(SessionStatus sessionStatus){

        System.out.println("ResponseController.clear");
        //清空session  @SessionAttributes(names = {"key"})
        sessionStatus.setComplete();

        return "index";
    }



    /**
     * 简化返回页面
     * @param
     * @return
     */
    //@GetMapping("jump")
    @RequestMapping(value = "jump")
    public String jump(Map data){

        //request
        data.put("key", "hehehemap");
        System.out.println("ResponseController.jump");
        return "index";
    }


    @RequestMapping(value = "jump1")
    public String jump1(Model model){

        //request
        model.addAttribute("key", "hahahahmodel");
        System.out.println("ResponseController.jump");
        return "index";
    }


    @RequestMapping(value = "jump2")
    public ModelAndView jump2(){

        //request
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");

        modelAndView.addObject("key", "lelelelemodelAndView");

        return modelAndView;
    }





    /**
     *  转发和重定向
     *    转发和重定向返回的都是字符串类型和跳转页面一致！
     *    但是需要在字符串前转化和重定向标识
     *       forward/redirct:路径
     *    注意注意注意：不能添加@responseBody
     *    路径问题：转发和重定向全是绝对路径   /类路径+方法路径
     *
     *    请求方式问题： 转发会延续发起的请求方式！要求转发方法和目标方法的请求方式必须一致！
     *                  重定向，不会延续发起的请求方式，跳转到目标默认GET方法
     *
     *     小知识： 被转发和重定向的方法建议不要设置请求方式限制！
     * @return
     */
    @PostMapping("forward")
    public String forward(){
        System.out.println("ResponseController.forward");
        return "forward:/resp/jump";
    }


    @PostMapping("redirect")
    public String redirect(){
        System.out.println("ResponseController.redirect");
        return "redirect:/resp/jump";
    }


    /**
     * 返回字节文件操作
     * handler方法直接返回void
     * @param response
     */
    @GetMapping("file")
    public void down(HttpServletResponse response){

        //1.读取文件流
        //2，写道前端
        //response.getOutputStream().write();

    }


    /**
     * 返回JSON字符串：
     *     1. 导入依赖
     *     2. 配置json转化器
     *     3. handler直接返回对应的类型 - handlerAdapter - 转成json字符串
     *     4. @ResponseBody 将字符串直接放在响应体中返回 【跳过视图解析】
     * @return
     *
     * @RequestBody 获取请求体的数据 json
     *     请求方式：post
     *     consumes: 客户端给服务器的JSON数据格式和编码格式
     * @ResponseBody 放入响应体数据 不走视图解析其
     *     请求方式： 不限制
     *     produces： 你返回给客户端的json数据格式和编码格式
     */
    @GetMapping(value = "json",produces = "application/json;charset=utf-8")
    //将数据直接放在响应体返回，不走视视图解析器

    public Map<String,Object> retJson(){

        Map<String,Object> map = new HashMap<>();
        map.put("name", "二狗子");
        map.put("age", 18);

        //{name,age}
        return map;
    }



    @GetMapping("index")
    @ResponseBody
    public String retString(){

        return "index";
    }



}
